// 1. 注册插件到 Scratch 环境
class ScratchCurlPlugin {
  constructor(vm) {
    this.vm = vm; // 关联 Scratch 虚拟机
    this.responseData = ""; // 存储请求响应结果
    this.initBlocks(); // 初始化自定义积木
  }

  // 2. 定义 Curl 核心请求逻辑（模拟 GET/POST）
  async curlRequest(method, url, headers = {}, body = {}) {
    try {
      // 处理请求参数格式
      const requestOptions = {
        method: method.toUpperCase(),
        headers: new Headers(headers),
        mode: "cors", // 跨域配置（Scratch 运行环境需允许）
        cache: "no-cache"
      };
      // POST 请求添加请求体
      if (method.toUpperCase() === "POST" && Object.keys(body).length > 0) {
        requestOptions.body = JSON.stringify(body);
        requestOptions.headers.append("Content-Type", "application/json");
      }

      // 发起请求（模拟 Curl 行为）
      const response = await fetch(url, requestOptions);
      if (!response.ok) throw new Error(`请求失败：${response.status}`);
      
      // 存储响应结果（支持文本/JSON 格式）
      this.responseData = await response.text();
      try {
        this.responseData = JSON.parse(this.responseData); // 尝试解析 JSON
      } catch (e) { /* 非 JSON 格式则保留文本 */ }
      return this.responseData;
    } catch (error) {
      this.responseData = `错误：${error.message}`;
      return this.responseData;
    }
  }

  // 3. 初始化 Scratch 自定义积木
  initBlocks() {
    const blockDefinitions = {
      // 积木1：GET 请求（参数：URL、请求头）
      curlGet: {
        blockType: this.vm.runtime.BlockType.COMMAND,
        text: "Curl GET 请求 URL: [URL]  请求头: [HEADERS]",
        arguments: {
          URL: {
            type: this.vm.runtime.ArgumentType.STRING,
            defaultValue: "https://api.example.com/data"
          },
          HEADERS: {
            type: this.vm.runtime.ArgumentType.STRING,
            defaultValue: '{"Authorization":"token"}' // 示例：带授权头
          }
        },
        func: async (args) => {
          const url = args.URL.trim();
          const headers = JSON.parse(args.HEADERS.trim() || "{}");
          await this.curlRequest("GET", url, headers);
        }
      },

      // 积木2：POST 请求（参数：URL、请求头、请求体）
      curlPost: {
        blockType: this.vm.runtime.BlockType.COMMAND,
        text: "Curl POST 请求 URL: [URL]  头: [HEADERS]  体: [BODY]",
        arguments: {
          URL: {
            type: this.vm.runtime.ArgumentType.STRING,
            defaultValue: "https://api.example.com/submit"
          },
          HEADERS: {
            type: this.vm.runtime.ArgumentType.STRING,
            defaultValue: '{"Content-Type":"application/json"}'
          },
          BODY: {
            type: this.vm.runtime.ArgumentType.STRING,
            defaultValue: '{"name":"scratch","value":"123"}'
          }
        },
        func: async (args) => {
          const url = args.URL.trim();
          const headers = JSON.parse(args.HEADERS.trim() || "{}");
          const body = JSON.parse(args.BODY.trim() || "{}");
          await this.curlRequest("POST", url, headers, body);
        }
      },

      // 积木3：获取请求响应结果
      getCurlResponse: {
        blockType: this.vm.runtime.BlockType.REPORTER,
        text: "Curl 请求响应结果",
        func: () => JSON.stringify(this.responseData) // 转为字符串方便 Scratch 处理
      }
    };

    // 4. 注册积木到 Scratch 分类（新增「网络请求」分类）
    this.vm.runtime.registerBlocks("curlPlugin", blockDefinitions, {
      categoryName: "网络请求",
      color: "#4CAF50" // 积木颜色（绿色，区分默认分类）
    });
  }
}

// 5. 挂载插件到 Scratch 虚拟机（需在 Scratch 初始化后执行）
window.initScratchCurlPlugin = (vm) => {
  new ScratchCurlPlugin(vm);
  console.log("Scratch Curl 插件初始化完成");
};